package com.ccnf.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;
import com.ccnf.handler.SQLMetaObjectHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@MapperScan("com.ccnf.model.mapper")
public class MybatisPlusConfig {

    /**
    * 分页插件，自动识别数据库类型
    * 多租户，请参考官网【插件扩展】
    */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    /**
     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
     * 性能分析拦截器，用于输出每条 SQL 语句及其执行时间
     * 设置 dev test 环境开启
     */
    @Bean
    @Profile({"dev"})
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(0);// sql 最大执行时长
        performanceInterceptor.setFormat(false);// SQL是否格式化 默认false
        return performanceInterceptor;
    }

    /**
     * mybatis-plus SQL执行分析拦截器插件【生产环境可以关闭】
     * SQL 执行分析拦截器【 目前只支持 MYSQL-5.6.3 以上版本 】，作用是分析 处理 DELETE UPDATE 语句， 防止小白或者恶意 delete update 全表操作
     * 设置 dev test 环境开启
     */
    @Bean
    @Profile({"dev"})
    public SqlExplainInterceptor sqlExplainInterceptor() {
        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
//        sqlExplainInterceptor.setStopProceed(true);
        return sqlExplainInterceptor;
    }

    /**
     * mybatis-plus 乐观锁插件
     * 意图：
     * 当要更新一条记录的时候，希望这条记录没有被别人更新
     * 乐观锁实现方式：
     * 1.取出记录时，获取当前version
     * 2.更新时，带上这个version
     * 3.执行更新时， set version = yourVersion+1 where version = yourVersion
     * 4.如果version不对，就更新失败
     * 注意：实体类需要加一个@Version注解的字段，数据库也需要加这个字段
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    /**
     * 自定义填充策略接口实现，可在数据插入和更新时执行一段逻辑
     */
    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new SQLMetaObjectHandler();
    }

    /**
     * 注入sql注入器
     */
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }
}
